/*
 * List.java
 *
 * Created on 23 marzo 2004, 22.15
 */

package net.ermannofranco.xml.schema;

import net.ermannofranco.xml.Static;

/**
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */
public class List extends SchemaTag implements BaseTypeContainer {

	private static final long serialVersionUID = 4166846020228595696L;
	private boolean assigned;
	private BaseTypeContainer child;

	/**
	 * Creates a new instance of List Protetto
	 * 
	 * @param level
	 *            livello di indentazione
	 * @param container
	 *            tag contenitore
	 */
	protected List(int level, ISchemaTag container) {
		super("list", level, container);
	}

	/**
	 * @param itemType
	 * @return
	 */
	public List setItemType(SimpleType itemType) {
		if (assigned)
			throw new SchemaException(
					"Contenuto non conforme a list: uno e solo uno tra itemType e simpleType e' obbligatorio");
		addAttr("itemType", feedFormPrefix(itemType.getTypeName()));
		child = itemType;
		assigned = true;
		return this;
	}

	public List setItemType(XmlType itemType) {
		if (assigned)
			throw new SchemaException(
					"Contenuto non conforme a list: uno e solo uno tra itemType e simpleType e' obbligatorio");
		addAttr("itemType", getLocalNS() + Static.COLON
				+ XmlType.getType(itemType));// controllare
		// QName
		child = itemType;
		assigned = true;
		return this;

	}

	/**
	 * @return
	 */
	public SimpleType setSimpleType() {
		if (assigned)
			throw new SchemaException(
					"Contenuto non conforme a list: uno e solo uno tra itemType e simpleType e' obbligatorio");
		SimpleType s;
		add(s = new SimpleType(getLevel() + 1, this));
		child = s;
		assigned = true;
		return s;
	}

	/**
	 * @param name
	 * @return
	 */
//	public SimpleType setSimpleType(String name) {
//		return setSimpleType().setName(name);
//	}

	/**
	 * semplica override di convalida
	 * 
	 * @return super.toString()
	 */
	public String toPrint() {
		if (!assigned)
			throw new SchemaException(
					"Contenuto non conforme a list: uno tra itemType e simpleType e' obbligatorio");
		return super.toPrint();
	}

	public String toSave() {
		if (!assigned)
			throw new SchemaException(
					"Contenuto non conforme a list: uno tra itemType e simpleType e' obbligatorio");
		return super.toSave();
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            Stringa di documentazione
	 * @return autoriferimento all'oggetto corrente
	 */
	public List addDocumentation(String explanation) {
		addAnnotation().addDocumentation(explanation);
		return this;
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            testo della documentazione
	 * @param language
	 *            attributo di xml:lang, seguire le regole di i18n
	 * @return riferimento all'oggetto corrente
	 */
	public List addDocumentation(String explanation, String language) {
		addAnnotation().addDocumentation(explanation, language);
		return this;
	}

	public java.util.List<XmlType> getBaseTypes() {
		return child.getBaseTypes();
	}
}
